package 数据结构.栈和队列.study;

import org.w3c.dom.Node;

//利用链表实现队列
public class MyLinkedListQueue  {
    public class Node{
       public int val;
        public Node next;
        public Node(int val){
            this.val=val;
        }
    }
    //头节点
    public Node head;
    //记录了尾节点
    public Node last;
    //链表的长度
    public int useSize;
    public MyLinkedListQueue(){
        this.head=null;
        this.last=null;
    }
    //入队列:虽然是先进先出，但照样去加在后面即可，不用刻意加在前面，在出队列那里操作即可
    public void offer(int val){
         Node tem=new Node(val);
         if(useSize==0){
             this.head=tem;
             head.next=null;
         }else {
             last.next=tem;
             //重新定义尾节点
             last=tem;
         }
         this.useSize++;
    }
    //出队列：先进先出，所以出的是头节点即可
    public int poll(){
        //判断链表是否为null
        if(useSize==0){
            return 0;
        }
        //如果不为null，则代表要出第一个，即头节点
        Node tem=head;
        //将head指向下一个节点
        head=head.next;
        //如果此时的head为空，则代表什么呢，代表只有一个元素，将last也置空
        if(head==null){
            last=null;
        }
        this.useSize--;
        return tem.val;
    }
    //获取队头元素
    public int peak(){
        if(head==null){
            //证明队列为空
            throw new RuntimeException("队列为空");
        }
        return head.val;
    }
    public int getUseSize(){
        return useSize;
    }
    public boolean isEmpty(){
        return head==null;
    }
}
